package com.ruoyi.common.utils;

import com.ruoyi.common.core.domain.entity.EventDetail;
import com.ruoyi.common.enums.ApplyStatusEnum;

import java.util.Date;

/**
 * 报名状态工具类
 * 
 * @author xukai
 */
public class ApplyStatusUtils {
    
    /**
     * 判断报名状态
     * 
     * @param eventDetail 活动详情
     * @param hasApplied 是否已报名
     * @return 报名状态枚举
     */
    public static ApplyStatusEnum getApplyStatus(EventDetail eventDetail, boolean hasApplied) {
        if (eventDetail == null) {
            return null;
        }
        
        // 如果已报名，直接返回已报名状态
        if (hasApplied) {
            return ApplyStatusEnum.APPLIED;
        }
        
        Date currentDate = new Date();
        
        // 判断报名状态
        if (currentDate.before(eventDetail.getSignupBegin())) {
            return ApplyStatusEnum.NOT_STARTED; // 报名未开始
        } else if (currentDate.after(eventDetail.getSignupBegin()) && currentDate.before(eventDetail.getSignupEnd())) {
            return ApplyStatusEnum.IN_PROGRESS; // 报名中
        } else {
            return ApplyStatusEnum.ENDED; // 报名已结束
        }
    }
    
    /**
     * 获取报名状态描述
     * 
     * @param eventDetail 活动详情
     * @param hasApplied 是否已报名
     * @return 报名状态描述
     */
    public static String getApplyStatusInfo(EventDetail eventDetail, boolean hasApplied) {
        ApplyStatusEnum statusEnum = getApplyStatus(eventDetail, hasApplied);
        return statusEnum != null ? statusEnum.getInfo() : "未知状态";
    }
    
    /**
     * 判断是否可以报名
     * 
     * @param eventDetail 活动详情
     * @param hasApplied 是否已报名
     * @return 是否可以报名
     */
    public static boolean canApply(EventDetail eventDetail, boolean hasApplied) {
        if (eventDetail == null) {
            return false;
        }
        
        // 如果已报名，不能再报名
        if (hasApplied) {
            return false;
        }
        
        // 如果名额已满，不能报名
        if (eventDetail.getRemain() <= 0) {
            return false;
        }
        
        ApplyStatusEnum statusEnum = getApplyStatus(eventDetail, false);
        return statusEnum == ApplyStatusEnum.IN_PROGRESS;
    }
    
    /**
     * 设置报名状态
     * 
     * @param eventDetailObj 活动详情
     * @param hasApplied 是否已报名
     * @param applyStatusField 报名状态字段名
     * @return 设置了报名状态的对象
     */
    public static Object setApplyStatus(Object eventDetailObj, boolean hasApplied, String applyStatusField) {
        if (eventDetailObj == null || !(eventDetailObj instanceof EventDetail)) {
            return eventDetailObj;
        }
        
        EventDetail eventDetail = (EventDetail) eventDetailObj;
        ApplyStatusEnum statusEnum = getApplyStatus(eventDetail, hasApplied);
        
        try {
            // 使用反射设置报名状态字段
            java.lang.reflect.Field field = eventDetailObj.getClass().getDeclaredField(applyStatusField);
            field.setAccessible(true);
            field.set(eventDetailObj, statusEnum.getCode());
        } catch (Exception e) {
            // 反射失败，忽略
        }
        
        return eventDetailObj;
    }
} 